package uoc.ei.practica;

import java.util.Date;

import uoc.ei.tads.Iterador;

/**
 * Clase que implementa las operaciones especificadas 
 * @see PaddleManager
 * @author equip docent de EI
 *
 */
public class PaddleManagerImpl implements PaddleManager {
	
	/** 
	 * lista de áreas
	 */
	private IdentifiedList<Area> areas;

	public PaddleManagerImpl() {
		this.areas=new IdentifiedList<Area>();
	}
	
	
	/**
	 * método que añade un área en el sistema. En caso que ya exista
	 * modifica sus datos.
	 */
	public void addArea(String areaId, String name) {
		Area area = (Area)this.areas.getIdentifiedObject(areaId);
		if (area==null) {
			area = new Area(areaId, name);
			this.areas.insertarAlFinal(area);
		}
		else {
			area.setName(name);
		}
		
		
	}

	/**
	 * método que proporciona la lista de áreas en el sistema
	 */
	public Iterador<Area> areas() throws EIException {
		Iterador<Area> ret = this.areas.elementos();
		if (!ret.haySiguiente()) throw new EIException(Messages.NO_AREAS);
		return this.areas.elementos();
	}

	/**
	 * método que añade un club en el sistema. En caso que no exista se deberá mostrar un error
	 */
	public void addPaddleClub(String paddleClubId, String name, String areaId,
			int numOfCourts) throws EIException {
		Area area = (Area)this.areas.getIdentifiedObject(areaId);
		if (area==null) throw new EIException(Messages.AREA_NOT_FOUND);
		area.addPaddleClub(paddleClubId, name, numOfCourts);
		
	}

	/**
	 * método que proporciona la lista de clubs que hay en un área.
	 */
	public Iterador<PaddleClub> paddleClubs(String areaId) throws EIException {
		// TODO Auto-generated method stub
		Area area = (Area)this.areas.getIdentifiedObject(areaId);
		if (area==null) throw new EIException(Messages.AREA_NOT_FOUND);
		Iterador<PaddleClub> paddleClubs = area.paddleClubs();
		if (!paddleClubs.haySiguiente()) throw new EIException(Messages.NO_PADDLE_CLUBS);
		return paddleClubs;
	}

	private PaddleClub getPaddleClub(String areaId, String paddleClubId) throws EIException {
		Area area = (Area)this.areas.getIdentifiedObject(areaId);
		if (area==null) throw new EIException(Messages.AREA_NOT_FOUND);
		PaddleClub paddleClub=area.getPaddleClub(paddleClubId);
		if (paddleClub==null) throw new EIException(Messages.PADEL_CLUB_NOT_FOUND);
		
		return paddleClub;
		
	}
	
	/**
	 * método que realiza una reserva en el sistema en un club determinado en un club de padel 
	 * para una área determinada en un día
	 */
	public Reserve booking(String areaId, String paddleClubId, Date date,
			int duration) throws EIException {
		
		PaddleClub paddleClub =getPaddleClub(areaId, paddleClubId);
		Reserve reserve=paddleClub.booking(date, duration);
		
		return reserve;
		
	}

	

	
	
}
